#Qt相关模块
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtCore import QPoint, Qt
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtWidgets import QDialog
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsDropShadowEffect
from PyQt5.QtCore import QPropertyAnimation,QRect,Qt,QThread, QParallelAnimationGroup
from PyQt5.QtWidgets import QLabel
from PyQt5.QtCore import pyqtSignal

#Qt以外模块
import sys, os, time, threading
import global_var
from threading import Thread
# from openpyxl import Workbook
# import numpy
# from yaml import DirectiveToken

#和其他文件链接
from StartWindow_ui import Ui_StartWindow
from PDS_Window_connect import Connect_PDS_Window                 # 光伏模型(P)，配电网(D)，标准方法(S)
from test2 import all

#未使用模块
#from multiprocessing import Process
#import math
global_var.__init__()
direction = os.path.dirname(os.path.abspath(__file__)) + os.sep   # 文件夹绝对路径+\
global_var.set_value('direction',direction)



class Connect_StartWindow(Ui_StartWindow,QMainWindow):

    def __init__(self):
        super(Connect_StartWindow,self).__init__()
        self.setupUi(self)       
        self.filepath=""
        self.File = None      # 1为已选择文件
        self.Model = None     # 0为光伏，1为风电
        self.NetWork = None   # 0为输电网，1为配电网

        self.SelectFile_Action.triggered.connect(self.SelectFile)
        self.comboBox_2.currentIndexChanged.connect(self.model)
        self.comboBox_3.currentIndexChanged.connect(self.network)
        # self.PhotovoltaicModel_Action.triggered.connect(self.PhotovoltaicModel)
        # self.WindPowerModel_Action.triggered.connect(self.WindPowerModel)
        # self.TransmissionNetwork_Action.triggered.connect(self.TransmissionNetwork)
        # self.DistributionNetwork_Action.triggered.connect(self.DistributionNetwork)
        self.StandardCalculation_Action.triggered.connect(self.StandardCalculation)
        self.FileFormat_Action.triggered.connect(self.FileFormat)
        self.Tip_Action.triggered.connect(self.Tip)
        self.WinServiceManual_Action.triggered.connect(self.WinServiceManual)
        self.iOSServiceManual_Action.triggered.connect(self.iOSServiceManual)
        self.About_Action.triggered.connect(self.About)
        self.Acknowledge_Action.triggered.connect(self.Acknowledge)

        self._translate = QtCore.QCoreApplication.translate

#选择文件按钮连接槽函数      
    def SelectFile(self):
        filepath, fileType = QtWidgets.QFileDialog.getOpenFileName(None, "选取文件", os.getcwd(),"All Files(*);;Text Files(*.txt)")
        self.filepath = filepath
        filename = filepath.split("/")[-1]

        self.File = 1
        self.label_3.setText(self._translate("MainWindow", "已选择文件:" + filename))

    def model(self):
        if self.comboBox_2.currentIndex() == 1:
            self.Model = 0
        if self.comboBox_2.currentIndex() == 2:
            self.Model = 1

    def network(self):
        if self.comboBox_3.currentIndex() == 1:
            self.NetWork = 0
        if self.comboBox_3.currentIndex() == 2:
            self.NetWork = 1

    def PhotovoltaicModel(self):
        self.Model = 0
        self.label_4.setText(self._translate("MainWindow", "已选择模型：光伏模型"))

    def WindPowerModel(self):
        self.Model = 1
        self.label_4.setText(self._translate("MainWindow", "已选择模型：风电模型"))
    
    def TransmissionNetwork(self):
        self.NetWork = 0
        self.label_5.setText(self._translate("MainWindow", "已选择网架结构：输电网"))

    def DistributionNetwork(self):
        self.NetWork = 1
        self.label_5.setText(self._translate("MainWindow", "已选择网架结构：配电网"))

    def StandardCalculation(self):
        if self.File == 0:
            reply = QtWidgets.QMessageBox.about(self,'注意','未选择文件，无法评估')   
        else:
            if self.Model == 0 and self.NetWork == 1:
                c1 = calculation(self.filepath)
                c1.start()
                c1.join()
                global_var.set_value('data',c1.data) 
                global_var.set_value('bcard',c1.bcard)
                global_var.set_value('lcard',c1.lcard)
                global_var.set_value('tcard',c1.tcard)
                global_var.set_value('dict_in',c1.dict_in)
                global_var.set_value('rootnode',c1.rootnode)
        
                self.PDS = Connect_PDS_Window()
                self.PDS.Grid_Button(global_var.get_value("dict_in"), global_var.get_value("rootnode"))
                self.PDS.Page3_Table(global_var.get_value("bcard"),global_var.get_value("lcard"),global_var.get_value("tcard"))
                self.PDS.show()
            else:
                reply = QtWidgets.QMessageBox.about(self,'注意','暂时无法进行此类评估')
 

#关于按钮连接槽函数
    def FileFormat(self):
        reply = QtWidgets.QMessageBox.about(self,'输入文件格式要求','1.本应用程序输入文件的格式应为PSD-BPA程序标准潮流数据文件格式\n2.由于本应用程序算法部分暂时仅支持处理B,BS,BQ,L,T类型的数据卡，故向本程序输入的潮流数据文件应只含B,BS,BQ,L,T类型数据卡')   

    def Tip(self):
        reply = QtWidgets.QMessageBox.about(self,'贴士','本应用程序使用潮流计算后的数据作为配电网实际运行数据，是在仅有电网系统数据时的情况下。该情况下，所得的各个电压等级母线的功率与实际运行时的功率有所差别。而且，缺少谐波数据使谐波校核无法进行，我们无法评估分布式光伏接入配电网对电能质量带来的影响。\n所以，本应用程序的评估结果与实际情况有一定偏差，用户应根据自身情况决定是否使用本应用程序提供的评估结果。')

    def WinServiceManual(self):
        reply = QtWidgets.QMessageBox.about(self,'Window系统使用手册','【运行】\nWindow系统用任意编译器打开并运行StartWindow_connect.py即可开启「分布式光伏承载力评估系统」。\n【PyQt5】\n此GUI采用Python语言编写，主要利用PyQt5库，具体所需模块及版本号如下，请用户于使用前搭建所需环境。\nPython > 3.0.0\nPyQt5  > 5.13.0 (请测试Python与PyQt5是否兼容)\nopenpyxl >= 3.0.7\nnumpy >= 1.20.0\nmatplotlib > 3.2.0')
    
    def iOSServiceManual(self):
        reply = QtWidgets.QMessageBox.about(self,'iOS系统使用手册','【运行】\niOS系统（Darwin）建议使用Anaconda-Navigator环境下的Spyder打开「分布式光伏承载力评估系统」相关文件。运行StartWindow_connect.py即可开启「分布式光伏承载力评估系统」。\n【Spyder】\n若在Spyder内因任何原因「分布式光伏承载力评估系统」运行中断，需手动强制退出「分布式光伏承载力评估系统」应用后再重新运行。\n【PyQt5】\n额外安装的PyQt5及其相关库可能引起Anaconda-Navigator环境内引用分歧，导致「分布式光伏承载力评估系统」运行中断。可行的解决方式：在终端输入pip list 或 conda list 找到已安装的所有PyQt5相关库，包括但不限于PyQt5、pyqt5-plugins、PyQt5-Qt5、PyQt5-sip、pyqt5-tools、pyqtgraph、PyQtWebEngine、PyQtWebEngine-Qt5。\npip uninstall <名称> 或 conda uninstall <名称>\n逐个卸载PyQt5相关库后，尝试再次运行「分布式光伏承载力评估系统」。')

    def About(self):
        reply = QtWidgets.QMessageBox.about(self,'关于','本应用程序是用于评估分布式光伏接入配电网的承载力的一个图形用户界面(GUI)。\n本应用程序的前身是浙江大学电气工程学院荀龙飞学长开发的分布式光伏接入配电网承载力评估算法及评估界面。浙江大学ZJUI学院学生许嘉容、朱璇、娄语桐在原设计的基础上，对程序算法部分进行了优化，并对用户界面进行了重设计，从而得到本版本的“分布式光伏接入配电网承载力评估界面”。')  

    def Acknowledge(self):
        reply = QtWidgets.QMessageBox.about(self,'鸣谢','感谢指导老师汪震教授对本项目的大力支持，感谢杨益坚学长对项目小组的指导与帮助，感谢荀龙飞学长无私提供自己的科研成果供项目小组使用！！！')       


class calculation(Thread):
    def __init__(self,filepath):
        super(calculation,self).__init__()
        self.filepath=filepath
        self.data = None
        self.bcard = None
        self.lcard = None
        self.tcard = None
        self.dict_in = None
        self.rootnode = None
    def run(self):
        self.data,self.bcard,self.lcard,self.tcard,self.dict_in,self.rootnode = all(self.filepath)


if __name__ == '__main__':

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) #导致界面出现在最顶上
    app = QtWidgets.QApplication(sys.argv)   
    icon = QtGui.QIcon()
    icon.addPixmap(QtGui.QPixmap(global_var.get_value('direction') + "pic" + os.sep + "icon.ico"),QtGui.QIcon.Normal, QtGui.QIcon.Off) #把图标文件添加到图标对象中
    app.setWindowIcon(icon)
    window = Connect_StartWindow()
    window.setWindowTitle("分布式光伏承载力评估界面")
    window.show()
    app.exec_()